#pragma once
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/tcp.h>
#include "InetAddress.h"

//创建一个非阻塞的socket
int createnonblocking();

//socket类
class Socket
{
private:
    const int fd_;      //Socket持有的fd，在构造函数中传进来
    std::string ip_;    //如果是listenfd，存放服务端监听的ip，如果是客户端连接的fd，存放对端的ip
    uint16_t port_;     //如果是listenfd，存放服务端监听的port，如果是客户端连接的fd，存放外部端口
public:
    Socket(int fd);
    ~Socket();

    int fd() const;             //返回fd_成员
    std::string ip() const;     //返回ip地址
    uint16_t port() const;      //返回端口
    void setreuseaddr(bool on); //设置SO_REUSEADDR选项，ture-打开，false-关闭
    void setreuseport(bool on); //设置SO_REUSERPORT选项
    void settcpnodelay(bool on); //设置TCP_NODELAY选项
    void setkeepalive(bool on); //设置SO_KEEPALIVE选项

    void bind(const InetAddress& servaddr); //服务端的socket将调用该函数
    void listen(int listen_Num = 128);
    int accept(InetAddress& clientaddr);

    void set_IP_PORT(const InetAddress& addr);        //设置ip和port
};